﻿/*
 Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
 */

CKEDITOR.htmlParser.basicWriter = CKEDITOR.tools.createClass(
    {
        $: function () {
            this._ =
            {
                output: []
            };
        },

        proto: {
            /**
             * Writes the tag opening part for a opener tag.
             * @param {String} tagName The element name for this tag.
             * @param {Object} attributes The attributes defined for this tag. The
             *        attributes could be used to inspect the tag.
             * @example
             * // Writes "&lt;p".
             * writer.openTag( 'p', { class : 'MyClass', id : 'MyId' } );
             */
            openTag: function (tagName, attributes) {
                this._.output.push('<', tagName);
            },

            /**
             * Writes the tag closing part for a opener tag.
             * @param {String} tagName The element name for this tag.
             * @param {Boolean} isSelfClose Indicates that this is a self-closing tag,
             *        like "br" or "img".
             * @example
             * // Writes "&gt;".
             * writer.openTagClose( 'p', false );
             * @example
             * // Writes " /&gt;".
             * writer.openTagClose( 'br', true );
             */
            openTagClose: function (tagName, isSelfClose) {
                if (isSelfClose)
                    this._.output.push(' />');
                else
                    this._.output.push('>');
            },

            /**
             * Writes an attribute. This function should be called after opening the
             * tag with {@link #openTagClose}.
             * @param {String} attName The attribute name.
             * @param {String} attValue The attribute value.
             * @example
             * // Writes ' class="MyClass"'.
             * writer.attribute( 'class', 'MyClass' );
             */
            attribute: function (attName, attValue) {
                // Browsers don't always escape special character in attribute values. (#4683, #4719).
                if (typeof attValue == 'string')
                    attValue = CKEDITOR.tools.htmlEncodeAttr(attValue);

                this._.output.push(' ', attName, '="', attValue, '"');
            },

            /**
             * Writes a closer tag.
             * @param {String} tagName The element name for this tag.
             * @example
             * // Writes "&lt;/p&gt;".
             * writer.closeTag( 'p' );
             */
            closeTag: function (tagName) {
                this._.output.push('</', tagName, '>');
            },

            /**
             * Writes text.
             * @param {String} text The text value
             * @example
             * // Writes "Hello Word".
             * writer.text( 'Hello Word' );
             */
            text: function (text) {
                this._.output.push(text);
            },

            /**
             * Writes a comment.
             * @param {String} comment The comment text.
             * @example
             * // Writes "&lt;!-- My comment --&gt;".
             * writer.comment( ' My comment ' );
             */
            comment: function (comment) {
                this._.output.push('<!--', comment, '-->');
            },

            /**
             * Writes any kind of data to the ouput.
             * @example
             * writer.write( 'This is an &lt;b&gt;example&lt;/b&gt;.' );
             */
            write: function (data) {
                this._.output.push(data);
            },

            /**
             * Empties the current output buffer.
             * @example
             * writer.reset();
             */
            reset: function () {
                this._.output = [];
                this._.indent = false;
            },

            /**
             * Empties the current output buffer.
             * @param {Boolean} reset Indicates that the {@link reset} function is to
             *        be automatically called after retrieving the HTML.
             * @returns {String} The HTML written to the writer so far.
             * @example
             * var html = writer.getHtml();
             */
            getHtml: function (reset) {
                var html = this._.output.join('');

                if (reset)
                    this.reset();

                return html;
            }
        }
    });
